﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using EntidadesCompartidas;
using System.Data.SqlClient;
using System.Data;

using Persistencia.Properties;

namespace Persistencia.Datos
{
    public class PersUsuario:Interfaces.IPersUsuario
    {
        //Elementos que determinan el singleton
        //1- Atributo de Clase
        private static PersUsuario _miPersistenciaUsuario = null;
        //2- Constructor
        private PersUsuario() { }
        //3- Metodo de Clase
        public static PersUsuario GetUsuario()
        {
            if (_miPersistenciaUsuario == null)
            {
                _miPersistenciaUsuario = new PersUsuario();
            }
            return _miPersistenciaUsuario;

        }
        /////////////////////////////////////////////////////////////////////////////////////////////

        #region Miembros de IPersUsuario

        public Usuario BuscarUsuario(int pCi)
        {
            string _nombre;
            string _apellido;
            string _user;
            string _contrasena;
            int _rol;
            
            Usuario _elUsuario = null;

            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "select nombre, apellido, usuario,dbo.fnLeeClave(Contrasena) as Contrasena,idr from Usuarios where CI = " + pCi + " and EliminacionLogica = 1";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);
            
            SqlDataReader _lector;

            try
            {
                _conexion.Open();
                _lector = _comando.ExecuteReader();
                if (_lector.Read())
                {
                    _nombre = (string)_lector["Nombre"];
                    _apellido = (string)_lector["Apellido"];
                    _user = (string)_lector["Usuario"];
                    _contrasena = (string)_lector["Contrasena"];
                    //--------------------------
                    _rol = (int)_lector["Idr"];
                    RolUsuario rl;
                    if (_rol == 1)
                        rl = RolUsuario.administrador;
                    else if (_rol == 2)
                        rl = RolUsuario.habPrincipal;
                    else if (_rol == 3)
                        rl = RolUsuario.habSecundario;
                    else
                        rl = RolUsuario.habTerciario;
                    //--------------------------
                    _elUsuario = new Usuario(pCi, _nombre, _apellido, _user, _contrasena, rl);
                }
                _lector.Close();

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }
            return _elUsuario;
        }
        //------------------------------------------------------------------------------------------
        public List<Usuario> UsuariosXidCasa(int idc)
        {
            int _ci;
            Usuario _elUsuario = null;
            List<Usuario> _usuarios = new List<Usuario>(); 

            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "select CI from UsuarioXCasa where idc = " + idc + "and EliminacionLogica=1";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);

            SqlDataReader _lector;

            try
            {
                _conexion.Open();
                _lector = _comando.ExecuteReader();
                if (_lector.Read())
                {
                    _ci = (int)_lector["ci"];
                     _elUsuario = BuscarUsuario(_ci);
                     _usuarios.Add(_elUsuario);
                }
                _lector.Close();

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }
            return _usuarios;
        }

        //------------------------------------------------------------------------------------------
        public Usuario LogeoUsuario(string pUser, string pClave)
        {
            int _ci;
            string _nombre;
            string _apellido;
            string _user;
            string _contrasena;
            int _rol;
            Usuario _elUsuario = null;

            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "select CI,Nombre,Apellido,Usuario,dbo.fnLeeClave(Contrasena) as 'Pass',Idr,EliminacionLogica from usuarios where Usuario='" + pUser + "' and dbo.fnLeeClave(contrasena) = '" + pClave + "'" + " and EliminacionLogica=1";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);
            
            SqlDataReader _lector;

            try
            {
                _conexion.Open();
                _lector = _comando.ExecuteReader();
                if (_lector.Read())
                {
                    _ci = (int)_lector["CI"];
                    _nombre = (string)_lector["Nombre"];
                    _apellido= (string)_lector["Apellido"];
                    _user = (string)_lector["Usuario"];
                    _contrasena = (string)_lector["Pass"];
                    //--------------------------
                    _rol = (int)_lector["Idr"];
                    RolUsuario rl;
                    if (_rol == 1)
                        rl = RolUsuario.administrador;
                    else if (_rol == 2)
                        rl = RolUsuario.habPrincipal;
                    else if (_rol == 3)
                        rl = RolUsuario.habSecundario;
                    else
                        rl = RolUsuario.habTerciario;
                    //--------------------------
                    _elUsuario = new Usuario(_ci, _nombre, _apellido, _user, _contrasena, rl);
                }
                _lector.Close();

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }
            return _elUsuario;
        }
       //------------------------------------------------------------------------------------------
        public int AltaUsuario(Usuario pUser)
        {

            int rl;
            if (pUser.ElRol == RolUsuario.administrador)
                rl = 1;
            else if (pUser.ElRol == RolUsuario.habPrincipal)
                rl = 2;
            else if (pUser.ElRol == RolUsuario.habSecundario)
                rl = 3;
            else
                rl = 4;

            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "insert into Usuarios(CI,Nombre,Apellido,Usuario,Contrasena,Idr,EliminacionLogica) values(" +
                                pUser.Ci + ",'" +
                                pUser.Nombre + "','" +
                                pUser.Apellido + "','" +
                                pUser.User + "'," +
                                "dbo.fnEscribeClave('" + pUser.Pass + "')" + "," +
                                rl + "," +
                                1 + ")";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);
            int _afectados = -1;

            try
            {
                _conexion.Open();
                _afectados = _comando.ExecuteNonQuery();                
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }

            return _afectados;
        }
        //------------------------------------------------------------------------------------------
        //------------------------------------------------------------------------------------------
        public int AltaUsuarioXCasa(Usuario pUser,Casa pCasa)
        {

            int rl;
            if (pUser.ElRol == RolUsuario.administrador)
                rl = 1;
            else if (pUser.ElRol == RolUsuario.habPrincipal)
                rl = 2;
            else if (pUser.ElRol == RolUsuario.habSecundario)
                rl = 3;
            else
                rl = 4;

            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            SqlTransaction _miTran = null;
            string consulta = "insert into Usuarios(CI,Nombre,Apellido,Usuario,Contrasena,Idr,EliminacionLogica) values(" +
                                pUser.Ci + ",'" +
                                pUser.Nombre + "','" +
                                pUser.Apellido + "','" +
                                pUser.User + "'," +
                                "dbo.fnEscribeClave('" + pUser.Pass + "')" + "," +
                                rl + "," +
                                1 + ")";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);
            int _afectados = -1;

            try
            {
                _conexion.Open();
                _afectados = _comando.ExecuteNonQuery();
                _miTran = _conexion.BeginTransaction();
                _comando.Transaction = _miTran;
                if (_afectados == 1)
                {
                    SqlCommand _2comando = null;
                    string _2consulta = "insert into UsuarioXCasa values(" + pUser.Ci + ", " + pCasa.Id + ", 1)";
                    _2comando = new SqlCommand(_2consulta, _conexion);
                    //-- tran --
                    _2comando.Transaction = _miTran;
                    _2comando.ExecuteNonQuery();
                }
                _miTran.Commit();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }

            return _afectados;
        }
        //------------------------------------------------------------------------------------------
        public int ModificarUsuario(Usuario pUser)
        {
            int rl;
            if (pUser.ElRol == RolUsuario.administrador)
                rl = 1;
            else if (pUser.ElRol == RolUsuario.habPrincipal)
                rl = 2;
            else if (pUser.ElRol == RolUsuario.habSecundario)
                rl = 3;
            else 
                rl = 4;
            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "update Usuarios set"
                                + " Contrasena= dbo.fnEscribeClave('" + pUser.Pass + "')"
                                + ", Idr= " + rl
                                + " where CI = " + pUser.Ci + " and EliminacionLogica = 1"; 
            SqlCommand _comando = new SqlCommand(consulta, _conexion);
            int _afectados = -1;
            try
            {
                _conexion.Open();
                _afectados = _comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }

            return _afectados;
        }
        //------------------------------------------------------------------------------------------
        public int EliminarUsuario(Usuario pUser)
        {
            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "update Usuarios set EliminacionLogica = 0 where CI = " + pUser.Ci + " and EliminacionLogica = 1";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);
            int _afectados = -1;
            try
            {
                _conexion.Open();
                _afectados = _comando.ExecuteNonQuery();

                SqlCommand _2comando = null;
                string _2consulta = "update UsuarioXCasa set EliminacionLogica=" + 0 + " where CI = " + pUser.Ci + " and EliminacionLogica = 1";
                _2comando = new SqlCommand(_2consulta, _conexion);
                _afectados = _2comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }

            return _afectados;
        }
        //------------------------------------------------------------------------------------------
        public List<Usuario> ListarUsuariosXcasa(Casa pCasa) 
        {
            int _ci;
            Usuario _elUsuario = null;
            List<Usuario> _usuarios = new List<Usuario>();

            SqlConnection _conexion = new SqlConnection(Settings.Default.dbSmartHouseConnectionString);
            string consulta = "select CI from UsuarioXCasa where idc = " + pCasa.Id + " and EliminacionLogica = 1";
            SqlCommand _comando = new SqlCommand(consulta, _conexion);

            SqlDataReader _lector;

            try
            {
                _conexion.Open();
                _lector = _comando.ExecuteReader();
                while (_lector.Read())
                {
                    _ci = (int)_lector["ci"];
                    _elUsuario = BuscarUsuario(_ci);
                    _usuarios.Add(_elUsuario);
                }
                _lector.Close();

            }
            catch (Exception ex)
            {
                throw new ApplicationException("Problemas con la base de datos:" + ex.Message);
            }
            finally
            {
                _conexion.Close();
            }
            return _usuarios;
        }
        #endregion
    }
}
